import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
import { Reflector } from '@nestjs/core';
import { ROLES_KEY } from './roles.decorator';

/**
 * 角色守卫，用于验证用户角色是否符合路由的角色权限
 */
@Injectable()
export class RolesGuard implements CanActivate {
  constructor(private reflector: Reflector) {} // 从 Reflector 中获取路由的角色权限

  /**
   * 验证用户角色是否符合路由的角色权限
   */
  canActivate(context: ExecutionContext): boolean {
    const required = this.reflector.getAllAndOverride<string[]>(ROLES_KEY, [ // 从路由和控制器中获取角色权限
      context.getHandler(), // 从路由处理函数中获取角色权限
      context.getClass(), // 从控制器类中获取角色权限
    ]);
    if (!required || required.length === 0) return true; // 如果路由没有设置角色权限，默认允许访问
    const { user } = context.switchToHttp().getRequest(); // 从请求中获取用户信息
    const userRoles: string[] = user?.roles || []; // 获取用户角色，默认为空数组
    return required.every(r => userRoles.includes(r)); // 验证用户角色是否包含路由所需的所有角色  
  }
}